﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using RFServer.Drive;
using RFServer.Service;
using RFServer.ServiceWCF;
using RFServer.Monitor;
using RFServer.Interactive;
using RFServer.Functions;

namespace RFServer.Interactive
{
    public partial class InteractiveConsole : Form
    {
        public delegate void LogMethod(string text);
        public LogMethod logMethod { get; set; }

        public InteractiveConsole()
        {
            InitializeComponent();
        }

        private void StopServer(object sender, FormClosedEventArgs e)
        {
            btnStop.Enabled = false;
            TrayIcon.Visible = false;

            /* Остановка происходит только в том случае, если   */
            /* до этого не приходила команда SHUTDOWN           */

            if (!ServiceControl.Status.IsRunning())
                return;

            /* Сообщение об  остановке                          */

            Setup.Log("[server]: User stopped server");

            /* Уничтожение консоли                              */

            Setup.ConsoleForm = null;

            /* Остановка сервера                                */

            ServiceControl.Stop();
        }

        private void StartServer(object sender, EventArgs e)
        {
            /* Инициализация консоли                            */

            Setup.ConsoleForm = this;

            logMethod = new LogMethod(Log);

            /* Запуск сервера                                   */

            if (!ServiceControl.Start())
                return;

            /* Монтирование виртуального диска                  */

            Mounter.Automount();

            /* Запуск отслеживания изменений в локальных        */
            /* файловых системах                                */

            Watcher.Autowatch();
        }        

        public void Log(string text)
        {
            try
            {
                txtConsole.AppendText(text + "\n");
            }
            catch (Exception e)
            {
                Setup.LogToFile("[console]: Failed to output data '" + text + "': \n\n" + e + "\n");
            }
        }

        private void StopServer(object sender, EventArgs e)
        {
            ActivateMainWindow(sender, e);
            Close();
        }

        private void ActivateMainWindow(object sender, EventArgs e)
        {
            Show();
            Activate();
            Focus();
            WindowState = FormWindowState.Normal;
        }

        private void HideMainWindow(object sender, EventArgs e)
        {
            if (WindowState == FormWindowState.Minimized)
                Hide();
        }
    }
}
